import { defineStore } from 'pinia'
import { ref } from 'vue'
import request from '@/utils/request'

export const useUserStore = defineStore('user', () => {
  const token = ref(localStorage.getItem('token') || '')
  const userInfo = ref(null)
  const loginTime = ref(localStorage.getItem('loginTime') ? new Date(localStorage.getItem('loginTime')) : null)
  const isLoggingOut = ref(false) // 标记是否正在退出登录

  // 登录
  const login = async (username, password) => {
    const response = await request.post('/login', {
      username,
      password,
    })
    
    // 检查响应格式
    if (!response) {
      throw new Error('登录失败：服务器无响应')
    }
    
    // 如果响应有 code 字段，检查是否为 200
    if (response.code !== undefined && response.code !== 200) {
      throw new Error(response.message || '登录失败')
    }
    
    // 检查响应数据
    if (!response.data) {
      throw new Error('登录失败：响应数据为空')
    }
    
    // 设置 token 和用户信息
    if (response.data.token) {
      token.value = response.data.token
      localStorage.setItem('token', token.value)
    }
    
    if (response.data.user) {
      userInfo.value = response.data.user
    }
    
    // 记录登录时间
    loginTime.value = new Date()
    localStorage.setItem('loginTime', loginTime.value.toISOString())
    
    // 登录成功后，确保重置退出登录标志（防止异常状态）
    isLoggingOut.value = false
    
    return response
  }

  // 获取用户信息
  const getUserInfo = async () => {
    try {
      const response = await request.get('/me')
      if (response && response.code === 200) {
        userInfo.value = response.data
        return response.data
      } else {
        throw new Error(response?.message || '获取用户信息失败')
      }
    } catch (error) {
      // 重新抛出错误，让调用者处理
      throw error
    }
  }

  // 登出
  const logout = async (skipApiCall = false) => {
    // 如果正在退出登录，直接返回，防止重复调用
    if (isLoggingOut.value) {
      return
    }
    
    // 设置退出登录标志
    isLoggingOut.value = true
    
    try {
      // 如果 skipApiCall 为 true，跳过 API 调用（用于响应拦截器中的情况）
      if (!skipApiCall && token.value) {
        try {
          // 设置请求标记，防止拦截器再次触发 logout
          await request.post('/logout', {}, {
            skipAuthRedirect: true, // 标记此请求，拦截器不应触发 logout
          })
        } catch (error) {
          // 即使 logout API 调用失败，也继续清理本地状态
          console.error('登出 API 调用失败:', error)
        }
      }
    } finally {
      // 清理本地状态
      token.value = ''
      userInfo.value = null
      loginTime.value = null
      localStorage.removeItem('token')
      localStorage.removeItem('loginTime')
      
      // 延迟重置标志，确保所有相关清理完成
      setTimeout(() => {
        isLoggingOut.value = false
      }, 100)
    }
  }

  // 初始化登录时间（如果已登录）
  const initLoginTime = () => {
    if (token.value && !loginTime.value) {
      const savedLoginTime = localStorage.getItem('loginTime')
      if (savedLoginTime) {
        loginTime.value = new Date(savedLoginTime)
      } else {
        // 如果没有保存的登录时间，使用当前时间
        loginTime.value = new Date()
        localStorage.setItem('loginTime', loginTime.value.toISOString())
      }
    }
  }

  return {
    token,
    userInfo,
    loginTime,
    isLoggingOut,
    login,
    getUserInfo,
    logout,
    initLoginTime,
  }
})

